package com.wei.czz.framework.index.controller;

import com.wei.czz.common.dto.blog.BlogDto;
import com.wei.czz.common.enums.ResultEnum;
import com.wei.czz.common.enums.blog.BlogEnum;
import com.wei.czz.common.exception.CzzException;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.blog.SortVo;
import com.wei.czz.framework.index.service.SortService;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-05-25 21:54:00
 * className: SortController 浏览器页面-排行页面-接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("index/sort")
@AllArgsConstructor
public class SortController {

    private static final Logger log = LoggerFactory.getLogger(SortController.class);

    private final SortService sortService;

    /**
     * 查询综合排序的博客列表接口
     * 1：根据排序类型，获取类型对应的博客列表
     *  1.1：不存在检索内容，直接分页截取博客列表
     *  1.2：存在检索内容，检索符合条件的博客
     *
     * 调用方：
     *  1、浏览器-排序页面调用
     * @param sortVo 综合排序检索表单对象
     */
    @PostMapping("/synthesize/list")
    public Result<PageDto<BlogDto>> synthesizeBlogList(@RequestBody SortVo sortVo) {
        log.info("开始查询综合排序博客列表业务。{}", sortVo);

        if (sortVo.getSortType() == null) {
            log.info("查询综合排序博客列表接口请求参数错误");
            return Result.paramFail();
        }
        BlogEnum blogEnum = BlogEnum.getDisplayBlogType(sortVo.getSortType());
        if (blogEnum == null) {
            log.info("查询综合排序博客列表接口，找不到参数对应的现实博客类型");
            return Result.paramFail();
        }
        if (sortVo.getPage() == null || sortVo.getLimit() == null) {
            log.info("查询综合排序博客列表接口分页参数错误");
            return Result.pageFail();
        }

        PageDto<BlogDto> page = sortService.synthesizeBlogList(sortVo, blogEnum);

        log.info("查询综合排序博客列表业务结束");
        return Result.success(page);
    }

    /**
     * 查询热门博客列表接口
     * 1：根据排序类型，获取类型对应的博客列表
     *  1.1：不存在检索内容，直接分页截取博客列表
     *  1.2：存在检索内容，检索符合条件的博客，然后进行分页截取并返回
     *
     * 调用方：
     *  1、浏览器-排序页面调用
     * @param sortVo 热门博客检索表单对象
     */
    @PostMapping("/hot/list")
    public Result<PageDto<BlogDto>> hotBlogList(@RequestBody SortVo sortVo) {
        log.info("开始分页查询热门博客列表业务。{}", sortVo);

        // 请求参数校验
        this.checkSortBlogParams(sortVo, "查询热门博客列表接口");

        PageDto<BlogDto> page = sortService.hotBlogList(sortVo);

        log.info("分页查询热门博客列表业务结束");
        return Result.success(page);
    }

    /**
     * 查询系统推荐博客列表接口
     * 1：根据排序类型，获取类型对应的博客列表
     *  1.1：不存在检索内容，直接分页截取博客列表
     *  1.2：存在检索内容，检索符合条件的博客
     *
     * 调用方：
     *  1、浏览器-排序页面调用
     * @param sortVo 系统推荐博客检索表单对象
     */
    @PostMapping("/elite/list")
    public Result<PageDto<BlogDto>> eliteBlogList(@RequestBody SortVo sortVo) {
        log.info("开始分页查询系统推荐博客列表业务。{}", sortVo);
        // 请求参数校验
        this.checkSortBlogParams(sortVo, "查询系统推荐博客列表接口");

        PageDto<BlogDto> page = sortService.getEliteBlogList(sortVo);

        log.info("分页查询系统推荐博客列表业务结束");
        return Result.success(page);
    }

    /**
     * 校验博客排行列表请求参数
     * @param sortVo 请求参数封装对象
     */
    private void checkSortBlogParams(SortVo sortVo, String message) {
        if (sortVo.getSortType() == null || BlogEnum.getBlogSortType(sortVo.getSortType()) == null) {
            log.info("{}请求参数错误", message);
            throw new CzzException(ResultEnum.PARAM_FAIL);
        }
        if (sortVo.getPage() == null || sortVo.getLimit() == null) {
            log.info("{}分页参数错误", message);
            throw new CzzException(ResultEnum.PAGE_FAIL);
        }
    }
}
